/// <reference types="Cypress" />
import { GSHEET_DATA } from "../../fixtures/test-data-gsheet";
import {
  homePage,
  gsheetHelper,
  dataSources,
  agHelper,
  assertHelper,
  table,
  entityExplorer,
  deployMode,
  locators,
  draggableWidgets,
  appSettings,
} from "../../support/Objects/ObjectsCore";

const workspaceName = "gsheet apps";
const dataSourceName = "gsheet";
let appName = "gsheet-app";
let spreadSheetName = "test-sheet";
describe("GSheet Miscellaneous Tests", function () {
  const columnHeaders = [
    "uniq_id",
    "japanese_name",
    "currencies",
    "specialChars",
    "product_name",
    "manufacturer",
    "price",
    "rowIndex",
  ];
  before("Setup app and spreadsheet", function () {
    //Add a new app and an add new spreadsheet query
    //Setting up the spreadsheet name
    const uuid = Cypress._.random(0, 10000);
    spreadSheetName = spreadSheetName + "_" + uuid;
    appName = appName + "-" + uuid;

    //Adding query to insert a new spreadsheet
    homePage.NavigateToHome();
    homePage.CreateAppInWorkspace(workspaceName);
    homePage.RenameApplication(appName);
    gsheetHelper.AddNewSpreadsheetQuery(
      dataSourceName,
      spreadSheetName,
      JSON.stringify(GSHEET_DATA),
    );
    cy.get("@postExecute").then((interception: any) => {
      agHelper.Sleep();
      expect(
        interception.response.body.data.body.properties.title,
      ).to.deep.equal(spreadSheetName);
    });
  });

  it("1. Add query from active ds tab and verify", () => {
    dataSources.CreateQueryFromActiveTab(dataSourceName);
    // entityExplorer.CreateNewDsQuery(dataSourceName);
    agHelper.RenameWithInPane("Fetch_Details");
    dataSources.ValidateNSelectDropdown(
      "Operation",
      "Fetch Many",
      "Fetch Details",
    );
    dataSources.ValidateNSelectDropdown("Entity", "Spreadsheet");
    agHelper.Sleep(500);
    dataSources.ValidateNSelectDropdown("Spreadsheet", "", spreadSheetName);
    dataSources.RunQuery();
    cy.get("@postExecute").then((interception: any) => {
      expect(interception.response.body.data.body.name).to.deep.equal(
        spreadSheetName,
      );
    });
  });

  it("2. Add query from edit datasource page and verify", () => {
    dataSources.CreateQueryForDS(dataSourceName, "", "fetch_many", false);
    dataSources.ValidateNSelectDropdown("Operation", "Fetch Many");
    dataSources.ValidateNSelectDropdown("Entity", "Sheet Row(s)");
    agHelper.Sleep(500);
    dataSources.ValidateNSelectDropdown("Spreadsheet", "", spreadSheetName);
    dataSources.ValidateNSelectDropdown("Sheet name", "", "Sheet1");
    dataSources.RunQueryNVerifyResponseViews(GSHEET_DATA.length);
    dataSources.AssertQueryResponseHeaders(columnHeaders);
    dataSources.AssertQueryTableResponse(0, GSHEET_DATA[0].uniq_id);
    dataSources.AssertQueryTableResponse(1, "ホーンビィ 2014 カタログ"); // Asserting other language
    dataSources.AssertQueryTableResponse(2, "₹, $, €, ¥, £"); // Asserting different symbols
    dataSources.AssertQueryTableResponse(3, "!@#$%^&*"); // Asserting special chars
  });

  it("3. Add query from global search and verify", () => {
    dataSources.AddQueryFromGlobalSearch(dataSourceName);
    dataSources.ValidateNSelectDropdown("Operation", "Fetch Many");
    dataSources.ValidateNSelectDropdown("Entity", "Sheet Row(s)");
    agHelper.Sleep(500);
    dataSources.ValidateNSelectDropdown("Spreadsheet", "", spreadSheetName);
    dataSources.ValidateNSelectDropdown("Sheet name", "", "Sheet1");
    dataSources.RunQueryNVerifyResponseViews(GSHEET_DATA.length);
    dataSources.AssertQueryResponseHeaders(columnHeaders);
    dataSources.AssertQueryTableResponse(0, GSHEET_DATA[0].uniq_id);
    dataSources.AssertQueryTableResponse(1, "ホーンビィ 2014 カタログ"); // Asserting other language
    dataSources.AssertQueryTableResponse(2, "₹, $, €, ¥, £"); // Asserting different symbols
    dataSources.AssertQueryTableResponse(3, "!@#$%^&*"); // Asserting special chars
  });

  it("4. Generate CRUD page from active datasource page and verify", () => {
    // Navigating to active datasource page
    dataSources.NavigateFromActiveDS(dataSourceName, false, false);

    // Select the spreadsheet and sheet name
    agHelper.GetNClick(dataSources._selectTableDropdown, 0, true);
    agHelper.GetNClickByContains(dataSources._dropdownOption, spreadSheetName);
    agHelper.Sleep(1000);
    agHelper.GetNClick(dataSources._selectSheetNameDropdown, 0, true);
    agHelper.GetNClickByContains(dataSources._dropdownOption, "Sheet1");

    // Click on generate page button and verify the page is generated
    agHelper.GetNClick(dataSources._generatePageBtn);
    assertHelper.AssertNetworkStatus("@replaceLayoutWithCRUDPage", 201);
    agHelper.AssertContains("Successfully generated a page");
    assertHelper.AssertNetworkStatus("@getActions", 200);
    assertHelper.AssertNetworkStatus("@postExecute", 200);
    assertHelper.AssertNetworkStatus("@updateLayout", 200);
    agHelper.ClickButton("Got it");
    assertHelper.AssertNetworkStatus("@updateLayout", 200);

    //deploy the app and verify the table data
    deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE_V1));
    const data = GSHEET_DATA.filter((item) => item.rowIndex === "0")[0];
    table.ReadTableRowColumnData(0, 0, "v1").then((cellData) => {
      expect(cellData).to.eq(data.uniq_id);
    });
    table.ReadTableRowColumnData(0, 1, "v1").then((cellData) => {
      expect(cellData).to.eq(data.japanese_name);
    });
    table.ReadTableRowColumnData(0, 2, "v1").then((cellData) => {
      expect(cellData).to.eq(data.currencies);
    });
    table.ReadTableRowColumnData(0, 3, "v1").then((cellData) => {
      expect(cellData).to.eq(data.specialChars);
    });
    table.ReadTableRowColumnData(0, 4, "v1").then((cellData) => {
      expect(cellData).to.eq(data.product_name);
    });

    //Validating loaded JSON form
    agHelper.GetElement(locators._buttonByText("Update")).then((selector) => {
      cy.wrap(selector)
        .invoke("attr", "class")
        .then((classes) => {
          expect(classes).not.contain("bp3-disabled");
        });
    });

    dataSources.AssertJSONFormHeader(0, 13, "Id", "0");
    deployMode.NavigateBacktoEditor();
    table.WaitUntilTableLoad();
  });

  it("5. Generate CRUD page from entity explorer and verify", () => {
    // Adding pafe with data from entity explorer
    entityExplorer.AddNewPage("Generate page with data");

    // Select the datasource, spreadsheet and sheet name
    agHelper.GetNClick(dataSources._selectDatasourceDropdown);
    agHelper.GetNClickByContains(dataSources._dropdownOption, dataSourceName);
    agHelper.Sleep(1000);
    agHelper.GetNClick(dataSources._selectTableDropdown, 0, true);
    agHelper.GetNClickByContains(dataSources._dropdownOption, spreadSheetName);
    agHelper.Sleep(1000);
    agHelper.GetNClick(dataSources._selectSheetNameDropdown, 0, true);
    agHelper.GetNClickByContains(dataSources._dropdownOption, "Sheet1");

    // Click on generate page button and verify the page is generated
    agHelper.GetNClick(dataSources._generatePageBtn);
    assertHelper.AssertNetworkStatus("@replaceLayoutWithCRUDPage", 201);
    agHelper.AssertContains("Successfully generated a page");
    assertHelper.AssertNetworkStatus("@getActions", 200);
    assertHelper.AssertNetworkStatus("@postExecute", 200);
    assertHelper.AssertNetworkStatus("@updateLayout", 200);
    agHelper.ClickButton("Got it");
    assertHelper.AssertNetworkStatus("@updateLayout", 200);

    //deploy the app and verify the table data
    deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE_V1));
    const data = GSHEET_DATA.filter((item) => item.rowIndex === "1")[0];
    table.ReadTableRowColumnData(1, 0, "v1").then((cellData) => {
      expect(cellData).to.eq(data.uniq_id);
    });
    table.ReadTableRowColumnData(1, 1, "v1").then((cellData) => {
      expect(cellData).to.eq(data.japanese_name);
    });
    table.ReadTableRowColumnData(1, 2, "v1").then((cellData) => {
      expect(cellData).to.eq(data.currencies);
    });
    table.ReadTableRowColumnData(1, 3, "v1").then((cellData) => {
      expect(cellData).to.eq(data.specialChars);
    });
    table.ReadTableRowColumnData(1, 5, "v1").then((cellData) => {
      expect(cellData).to.eq(data.manufacturer);
    });

    //Validating loaded JSON form
    agHelper.GetElement(locators._buttonByText("Update")).then((selector) => {
      cy.wrap(selector)
        .invoke("attr", "class")
        .then((classes) => {
          expect(classes).not.contain("bp3-disabled");
        });
    });

    dataSources.AssertJSONFormHeader(0, 13, "Id", "0");
    deployMode.NavigateBacktoEditor();
    table.WaitUntilTableLoad();
  });

  it("6. Bug: 16391 - Verify placeholder texts for insert one/many queries", function () {
    // Verify place holder text for Insert one query
    let placeholderText =
      '{\n  "name": {{nameInput.text}},\n  "dob": {{dobPicker.formattedDate}},\n  "gender": {{genderSelect.selectedOptionValue}} \n}';
    gsheetHelper.EnterBasicQueryValues(
      "Insert One",
      dataSourceName,
      spreadSheetName,
      false,
    );
    agHelper.AssertText(
      dataSources._gSheetQueryPlaceholder,
      "text",
      placeholderText,
    );

    // Verify place holder text for Insert many query
    placeholderText =
      '[{\n  "name": {{nameInput.text}},\n  "dob": {{dobPicker.formattedDate}},\n  "gender": {{genderSelect.selectedOptionValue}} \n}]';

    gsheetHelper.EnterBasicQueryValues(
      "Insert Many",
      dataSourceName,
      spreadSheetName,
      false,
    );
    agHelper.AssertText(
      dataSources._gSheetQueryPlaceholder,
      "text",
      placeholderText,
    );
  });

  // This test is commented since we can't use Cypress to go to the Google authorization screen. We will uncomment it whenever we figure out how to do it.
  // it("7. Bug#26024 App level import of gsheet app", function () {
  //   homePage.NavigateToHome();
  //   homePage.CreateNewWorkspace("AppLevelImport");
  //   homePage.CreateAppInWorkspace("AppLevelImport", "AppLevelImportCheck");
  //   appSettings.OpenAppSettings();
  //   appSettings.GoToImport();
  //   agHelper.ClickButton("Import");
  //   homePage.ImportApp("ImportAppAllAccess.json", "", true);
  //   cy.wait("@importNewApplication").then(() => {
  //     agHelper.Sleep();
  //     agHelper.ClickButton("Save & Authorize");
  //   });
  //   cy.url().should("contain", "accounts.google.com");
  //   homePage.NavigateToHome();
  //   homePage.DeleteApplication("AppLevelImportCheck");
  //   homePage.DeleteWorkspace("AppLevelImport");
  // });

  after("Delete spreadsheet and app", function () {
    // Delete spreadsheet and app
    homePage.NavigateToHome();
    homePage.SearchAndOpenApp(appName);
    gsheetHelper.DeleteSpreadsheetQuery(dataSourceName, spreadSheetName);
    cy.get("@postExecute").then((interception: any) => {
      expect(interception.response.body.data.body.message).to.deep.equal(
        "Deleted spreadsheet successfully!",
      );
    });
    homePage.NavigateToHome();
    homePage.DeleteApplication(appName);
  });
});
